home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / tools / GLUT-3.7 / PROGS / DEMOS / GLUTMECH / GLUTMECH.C next >
Encoding:
C/C++ Source or Header  |  1998-08-12  |  35.8 KB  |  1,765 lines

  1.  
  2. /**
  3. * program    : glutmech V1.1
  4. * author    : Simon Parkinson-Bates.
  5. * E-mail    : sapb@yallara.cs.rmit.edu.au
  6. * Copyright Simon Parkinson-Bates.
  7. * "source if freely avaliable to anyone to copy as long as they
  8. *  acknowledge me in their work."
  9. *
  10. * Funtional features 
  11. * ------------------
  12. * * online menu system avaliable by pressing left mouse button
  13. * * online cascading help system avaliable, providing information on
  14. *    the several  key strokes and what they do.
  15. * * animation sequence coded which makes the mech walk through an
  16. *    environment.  Shadows will soon be added to make it look
  17. *    more realistic.
  18. * * menu control to view mech in wireframe or sold mode.
  19. * * various key strokes avaliable to control idependently the mechs
  20. *    many joints.
  21. * * various key strokes avaliable to view mech and environment from 
  22. *    different angles
  23. * * various key strokes avaliable to alter positioning of the single
  24. *    light source.
  25. *
  26. *
  27. * Program features
  28. * ----------------
  29. * * uses double buffering
  30. * * uses display lists
  31. * * uses glut to manage windows, callbacks, and online menu.
  32. * * uses glpolygonfill() to maintain colors in wireframe and solid
  33. *    mode.
  34. *
  35. **/
  36.  
  37. /* start of compilation conditions */
  38. #define SPHERE
  39. #define COLOR
  40. #define LIGHT
  41. #define TORSO
  42. #define HIP
  43. #define SHOULDER
  44. #define UPPER_ARM
  45. #define LOWER_ARM
  46. #define ROCKET_POD
  47. #define UPPER_LEG
  48. #define LOWER_LEG
  49. #define NO_NORM
  50. #define ANIMATION
  51. #define DRAW_MECH
  52. #define DRAW_ENVIRO
  53. #define MOVE_LIGHT
  54. /* end of compilation conditions */
  55.  
  56. /* start various header files needed */
  57. #include <stdlib.h>
  58. #include <math.h>
  59. #define GLUT
  60. #define GLUT_KEY
  61. #define GLUT_SPEC
  62. #include <GL/glut.h>
  63. /* end of header files */
  64.  
  65. /* start of display list definitions */
  66. #define SOLID_MECH_TORSO           1
  67. #define SOLID_MECH_HIP          2
  68. #define SOLID_MECH_SHOULDER     3
  69. #define SOLID_MECH_UPPER_ARM    4
  70. #define SOLID_MECH_FOREARM    5
  71. #define SOLID_MECH_UPPER_LEG       6
  72. #define SOLID_MECH_FOOT            7
  73. #define SOLID_MECH_ROCKET          8
  74. #define SOLID_MECH_VULCAN    9
  75. #define SOLID_ENVIRO        10
  76. /* end of display list definitions */
  77.  
  78. /* start of motion rate variables */
  79. #define ANKLE_RATE    3
  80. #define HEEL_RATE    3
  81. #define ROTATE_RATE    10
  82. #define TILT_RATE    10
  83. #define ELBOW_RATE    2
  84. #define SHOULDER_RATE    5
  85. #define LAT_RATE    5
  86. #define CANNON_RATE    40
  87. #define UPPER_LEG_RATE    3
  88. #define UPPER_LEG_RATE_GROIN 10
  89. #define LIGHT_TURN_RATE    10
  90. #define VIEW_TURN_RATE    10
  91. /* end of motion rate variables */
  92.  
  93. /* start of motion  variables */
  94.  
  95. /* Some <math.h> files do not define M_PI... */
  96. #ifndef M_PI
  97. #define M_PI 3.14159265358979323846
  98. #endif
  99.  
  100. GLUquadricObj *qobj;
  101.  
  102. char leg = 0;
  103.  
  104. int shoulder1 = 0, shoulder2 = 0, shoulder3 = 0, shoulder4 = 0, lat1 = 20, lat2 = 20,
  105.   elbow1 = 0, elbow2 = 0, pivot = 0, tilt = 10, ankle1 = 0, ankle2 = 0, heel1 = 0,
  106.   heel2 = 0, hip11 = 0, hip12 = 10, hip21 = 0, hip22 = 10, fire = 0, solid_part = 0,
  107.   anim = 0, turn = 0, turn1 = 0, lightturn = 0, lightturn1 = 0;
  108.  
  109. float elevation = 0.0, distance = 0.0, frame = 3.0
  110.  /* foot1v[] = {} foot2v[] = {} */ ;
  111.  
  112. /* end of motion variables */
  113.  
  114. /* start of material definitions */
  115. #ifdef LIGHT
  116. GLfloat mat_specular[] =
  117. {0.628281, 0.555802, 0.366065, 1.0};
  118. GLfloat mat_ambient[] =
  119. {0.24725, 0.1995, 0.0745, 1.0};
  120. GLfloat mat_diffuse[] =
  121. {0.75164, 0.60648, 0.22648, 1.0};
  122. GLfloat mat_shininess[] =
  123. {128.0 * 0.4};
  124.  
  125. GLfloat mat_specular2[] =
  126. {0.508273, 0.508273, 0.508373};
  127. GLfloat mat_ambient2[] =
  128. {0.19225, 0.19225, 0.19225};
  129. GLfloat mat_diffuse2[] =
  130. {0.50754, 0.50754, 0.50754};
  131. GLfloat mat_shininess2[] =
  132. {128.0 * 0.6};
  133.  
  134. GLfloat mat_specular3[] =
  135. {0.296648, 0.296648, 0.296648};
  136. GLfloat mat_ambient3[] =
  137. {0.25, 0.20725, 0.20725};
  138. GLfloat mat_diffuse3[] =
  139. {1, 0.829, 0.829};
  140. GLfloat mat_shininess3[] =
  141. {128.0 * 0.088};
  142.  
  143. GLfloat mat_specular4[] =
  144. {0.633, 0.727811, 0.633};
  145. GLfloat mat_ambient4[] =
  146. {0.0215, 0.1745, 0.0215};
  147. GLfloat mat_diffuse4[] =
  148. {0.07568, 0.61424, 0.07568};
  149. GLfloat mat_shininess4[] =
  150. {128 * 0.6};
  151.  
  152. GLfloat mat_specular5[] =
  153. {0.60, 0.60, 0.50};
  154. GLfloat mat_ambient5[] =
  155. {0.0, 0.0, 0.0};
  156. GLfloat mat_diffuse5[] =
  157. {0.5, 0.5, 0.0};
  158. GLfloat mat_shininess5[] =
  159. {128.0 * 0.25};
  160.  
  161. #endif
  162. /* end of material definitions */
  163.  
  164. /* start of the body motion functions */
  165. void
  166. Heel1Add(void)
  167. {
  168.   heel1 = (heel1 + HEEL_RATE) % 360;
  169. }
  170.  
  171. void
  172. Heel1Subtract(void)
  173. {
  174.   heel1 = (heel1 - HEEL_RATE) % 360;
  175. }
  176.  
  177. void
  178. Heel2Add(void)
  179. {
  180.   heel2 = (heel2 + HEEL_RATE) % 360;
  181. }
  182.  
  183. void
  184. Heel2Subtract(void)
  185. {
  186.   heel2 = (heel2 - HEEL_RATE) % 360;
  187. }
  188.  
  189. void
  190. Ankle1Add(void)
  191. {
  192.   ankle1 = (ankle1 + ANKLE_RATE) % 360;
  193. }
  194.  
  195. void
  196. Ankle1Subtract(void)
  197. {
  198.   ankle1 = (ankle1 - ANKLE_RATE) % 360;
  199. }
  200.  
  201. void
  202. Ankle2Add(void)
  203. {
  204.   ankle2 = (ankle2 + ANKLE_RATE) % 360;
  205. }
  206.  
  207. void
  208. Ankle2Subtract(void)
  209. {
  210.   ankle2 = (ankle2 - ANKLE_RATE) % 360;
  211. }
  212.  
  213. void
  214. RotateAdd(void)
  215. {
  216.   pivot = (pivot + ROTATE_RATE) % 360;
  217. }
  218.  
  219. void
  220. RotateSubtract(void)
  221. {
  222.   pivot = (pivot - ROTATE_RATE) % 360;
  223. }
  224.  
  225. void
  226. MechTiltSubtract(void)
  227. {
  228.   tilt = (tilt - TILT_RATE) % 360;
  229. }
  230.  
  231. void
  232. MechTiltAdd(void)
  233. {
  234.   tilt = (tilt + TILT_RATE) % 360;
  235. }
  236.  
  237. void
  238. elbow1Add(void)
  239. {
  240.   elbow1 = (elbow1 + ELBOW_RATE) % 360;
  241. }
  242.  
  243. void
  244. elbow1Subtract(void)
  245. {
  246.   elbow1 = (elbow1 - ELBOW_RATE) % 360;
  247. }
  248.  
  249. void
  250. elbow2Add(void)
  251. {
  252.   elbow2 = (elbow2 + ELBOW_RATE) % 360;
  253. }
  254.  
  255. void
  256. elbow2Subtract(void)
  257. {
  258.   elbow2 = (elbow2 - ELBOW_RATE) % 360;
  259. }
  260.  
  261. void
  262. shoulder1Add(void)
  263. {
  264.   shoulder1 = (shoulder1 + SHOULDER_RATE) % 360;
  265. }
  266.  
  267. void
  268. shoulder1Subtract(void)
  269. {
  270.   shoulder1 = (shoulder1 - SHOULDER_RATE) % 360;
  271. }
  272.  
  273. void
  274. shoulder2Add(void)
  275. {
  276.   shoulder2 = (shoulder2 + SHOULDER_RATE) % 360;
  277. }
  278.  
  279. void
  280. shoulder2Subtract(void)
  281. {
  282.   shoulder2 = (shoulder2 - SHOULDER_RATE) % 360;
  283. }
  284.  
  285. void
  286. shoulder3Add(void)
  287. {
  288.   shoulder3 = (shoulder3 + SHOULDER_RATE) % 360;
  289. }
  290.  
  291. void
  292. shoulder3Subtract(void)
  293. {
  294.   shoulder3 = (shoulder3 - SHOULDER_RATE) % 360;
  295. }
  296.  
  297. void
  298. shoulder4Add(void)
  299. {
  300.   shoulder4 = (shoulder4 + SHOULDER_RATE) % 360;
  301. }
  302.  
  303. void
  304. shoulder4Subtract(void)
  305. {
  306.   shoulder4 = (shoulder4 - SHOULDER_RATE) % 360;
  307. }
  308.  
  309. void
  310. lat1Raise(void)
  311. {
  312.   lat1 = (lat1 + LAT_RATE) % 360;
  313. }
  314.  
  315. void
  316. lat1Lower(void)
  317. {
  318.   lat1 = (lat1 - LAT_RATE) % 360;
  319. }
  320.  
  321. void
  322. lat2Raise(void)
  323. {
  324.   lat2 = (lat2 + LAT_RATE) % 360;
  325. }
  326.  
  327. void
  328. lat2Lower(void)
  329. {
  330.   lat2 = (lat2 - LAT_RATE) % 360;
  331. }
  332.  
  333. void
  334. FireCannon(void)
  335. {
  336.   fire = (fire + CANNON_RATE) % 360;
  337. }
  338.  
  339. void
  340. RaiseLeg1Forward(void)
  341. {
  342.   hip11 = (hip11 + UPPER_LEG_RATE) % 360;
  343. }
  344.  
  345. void
  346. LowerLeg1Backwards(void)
  347. {
  348.   hip11 = (hip11 - UPPER_LEG_RATE) % 360;
  349. }
  350.  
  351. void
  352. RaiseLeg1Outwards(void)
  353. {
  354.   hip12 = (hip12 + UPPER_LEG_RATE_GROIN) % 360;
  355. }
  356.  
  357. void
  358. LowerLeg1Inwards(void)
  359. {
  360.   hip12 = (hip12 - UPPER_LEG_RATE_GROIN) % 360;
  361. }
  362.  
  363. void
  364. RaiseLeg2Forward(void)
  365. {
  366.   hip21 = (hip21 + UPPER_LEG_RATE) % 360;
  367. }
  368.  
  369. void
  370. LowerLeg2Backwards(void)
  371. {
  372.   hip21 = (hip21 - UPPER_LEG_RATE) % 360;
  373. }
  374.  
  375. void
  376. RaiseLeg2Outwards(void)
  377. {
  378.   hip22 = (hip22 + UPPER_LEG_RATE_GROIN) % 360;
  379. }
  380.  
  381. void
  382. LowerLeg2Inwards(void)
  383. {
  384.   hip22 = (hip22 - UPPER_LEG_RATE_GROIN) % 360;
  385. }
  386.  
  387. /* end of body motion functions */
  388.  
  389. /* start of light source position functions */
  390. void
  391. TurnRight(void)
  392. {
  393.   turn = (turn - VIEW_TURN_RATE) % 360;
  394. }
  395.  
  396. void
  397. TurnLeft(void)
  398. {
  399.   turn = (turn + VIEW_TURN_RATE) % 360;
  400. }
  401.  
  402. void
  403. TurnForwards(void)
  404. {
  405.   turn1 = (turn1 - VIEW_TURN_RATE) % 360;
  406. }
  407.  
  408. void
  409. TurnBackwards(void)
  410. {
  411.   turn1 = (turn1 + VIEW_TURN_RATE) % 360;
  412. }
  413.  
  414. void
  415. LightTurnRight(void)
  416. {
  417.   lightturn = (lightturn + LIGHT_TURN_RATE) % 360;
  418. }
  419.  
  420. void
  421. LightTurnLeft(void)
  422. {
  423.   lightturn = (lightturn - LIGHT_TURN_RATE) % 360;
  424. }
  425.  
  426. void
  427. LightForwards(void)
  428. {
  429.   lightturn1 = (lightturn1 + LIGHT_TURN_RATE) % 360;
  430. }
  431.  
  432. void
  433. LightBackwards(void)
  434. {
  435.   lightturn1 = (lightturn1 - LIGHT_TURN_RATE) % 360;
  436. }
  437.  
  438. /* end of light source position functions */
  439.  
  440. /* start of geometric shape functions */
  441. void
  442. Box(float width, float height, float depth, char solid)
  443. {
  444.   char i, j = 0;
  445.   float x = width / 2.0, y = height / 2.0, z = depth / 2.0;
  446.  
  447.   for (i = 0; i < 4; i++) {
  448.     glRotatef(90.0, 0.0, 0.0, 1.0);
  449.     if (j) {
  450.       if (!solid)
  451.         glBegin(GL_LINE_LOOP);
  452.       else
  453.         glBegin(GL_QUADS);
  454.       glNormal3f(-1.0, 0.0, 0.0);
  455.       glVertex3f(-x, y, z);
  456.       glVertex3f(-x, -y, z);
  457.       glVertex3f(-x, -y, -z);
  458.       glVertex3f(-x, y, -z);
  459.       glEnd();
  460.       if (solid) {
  461.         glBegin(GL_TRIANGLES);
  462.         glNormal3f(0.0, 0.0, 1.0);
  463.         glVertex3f(0.0, 0.0, z);
  464.         glVertex3f(-x, y, z);
  465.         glVertex3f(-x, -y, z);
  466.         glNormal3f(0.0, 0.0, -1.0);
  467.         glVertex3f(0.0, 0.0, -z);
  468.         glVertex3f(-x, -y, -z);
  469.         glVertex3f(-x, y, -z);
  470.         glEnd();
  471.       }
  472.       j = 0;
  473.     } else {
  474.       if (!solid)
  475.         glBegin(GL_LINE_LOOP);
  476.       else
  477.         glBegin(GL_QUADS);
  478.       glNormal3f(-1.0, 0.0, 0.0);
  479.       glVertex3f(-y, x, z);
  480.       glVertex3f(-y, -x, z);
  481.       glVertex3f(-y, -x, -z);
  482.       glVertex3f(-y, x, -z);
  483.       glEnd();
  484.       if (solid) {
  485.         glBegin(GL_TRIANGLES);
  486.         glNormal3f(0.0, 0.0, 1.0);
  487.         glVertex3f(0.0, 0.0, z);
  488.         glVertex3f(-y, x, z);
  489.         glVertex3f(-y, -x, z);
  490.         glNormal3f(0.0, 0.0, -1.0);
  491.         glVertex3f(0.0, 0.0, -z);
  492.         glVertex3f(-y, -x, -z);
  493.         glVertex3f(-y, x, -z);
  494.         glEnd();
  495.       }
  496.       j = 1;
  497.     }
  498.   }
  499. }
  500.  
  501. void
  502. Octagon(float side, float height, char solid)
  503. {
  504.   char j;
  505.   float x = sin(0.785398163) * side, y = side / 2.0, z = height / 2.0, c;
  506.  
  507.   c = x + y;
  508.   for (j = 0; j < 8; j++) {
  509.     glTranslatef(-c, 0.0, 0.0);
  510.     if (!solid)
  511.       glBegin(GL_LINE_LOOP);
  512.     else
  513.       glBegin(GL_QUADS);
  514.     glNormal3f(-1.0, 0.0, 0.0);
  515.     glVertex3f(0.0, -y, z);
  516.     glVertex3f(0.0, y, z);
  517.     glVertex3f(0.0, y, -z);
  518.     glVertex3f(0.0, -y, -z);
  519.     glEnd();
  520.     glTranslatef(c, 0.0, 0.0);
  521.     if (solid) {
  522.       glBegin(GL_TRIANGLES);
  523.       glNormal3f(0.0, 0.0, 1.0);
  524.       glVertex3f(0.0, 0.0, z);
  525.       glVertex3f(-c, -y, z);
  526.       glVertex3f(-c, y, z);
  527.       glNormal3f(0.0, 0.0, -1.0);
  528.       glVertex3f(0.0, 0.0, -z);
  529.       glVertex3f(-c, y, -z);
  530.       glVertex3f(-c, -y, -z);
  531.       glEnd();
  532.     }
  533.     glRotatef(45.0, 0.0, 0.0, 1.0);
  534.   }
  535. }
  536.  
  537. /* end of geometric shape functions */
  538. #ifdef NORM
  539. void
  540. Normalize(float v[3])
  541. {
  542.   GLfloat d = sqrt(v[1] * v[1] + v[2] * v[2] + v[3] * v[3]);
  543.  
  544.   if (d == 0.0) {
  545.     printf("zero length vector");
  546.     return;
  547.   }
  548.   v[1] /= d;
  549.   v[2] /= d;
  550.   v[3] /= d;
  551. }
  552.  
  553. void
  554. NormXprod(float v1[3], float v2[3], float v[3], float out[3])
  555. {
  556.   GLint i, j;
  557.   GLfloat length;
  558.  
  559.   out[0] = v1[1] * v2[2] - v1[2] * v2[1];
  560.   out[1] = v1[2] * v2[0] - v1[0] * v2[2];
  561.   out[2] = v1[0] * v2[1] - v1[1] * v2[0];
  562.   Normalize(out);
  563. }
  564.  
  565. #endif
  566.  
  567. void
  568. SetMaterial(GLfloat spec[], GLfloat amb[], GLfloat diff[], GLfloat shin[])
  569. {
  570.  
  571.   glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
  572.   glMaterialfv(GL_FRONT, GL_SHININESS, shin);
  573.   glMaterialfv(GL_FRONT, GL_AMBIENT, amb);
  574.   glMaterialfv(GL_FRONT, GL_DIFFUSE, diff);
  575. }
  576.  
  577. void
  578. MechTorso(char solid)
  579. {
  580.   glNewList(SOLID_MECH_TORSO, GL_COMPILE);
  581. #ifdef LIGHT
  582.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  583. #endif
  584.   glColor3f(1.0, 1.0, 0.0);
  585.   Box(1.0, 1.0, 3.0, solid);
  586.   glTranslatef(0.75, 0.0, 0.0);
  587. #ifdef LIGHT
  588.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  589. #endif
  590.   glColor3f(0.5, 0.5, 0.5);
  591.   Box(0.5, 0.6, 2.0, solid);
  592.   glTranslatef(-1.5, 0.0, 0.0);
  593.   Box(0.5, 0.6, 2.0, solid);
  594.   glTranslatef(0.75, 0.0, 0.0);
  595.   glEndList();
  596. }
  597.  
  598. void
  599. MechHip(char solid)
  600. {
  601.   int i;
  602.  
  603.   glNewList(SOLID_MECH_HIP, GL_COMPILE);
  604. #ifdef LIGHT
  605.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  606. #endif
  607.   glColor3f(1.0, 1.0, 0.0);
  608.   Octagon(0.7, 0.5, solid);
  609. #ifdef SPHERE
  610.   for (i = 0; i < 2; i++) {
  611.     if (i)
  612.       glScalef(-1.0, 1.0, 1.0);
  613.     glTranslatef(1.0, 0.0, 0.0);
  614. #ifdef LIGHT
  615.     SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  616. #endif
  617.     glColor3f(0.5, 0.5, 0.5);
  618.     if (!solid)
  619.       gluQuadricDrawStyle(qobj, GLU_LINE);
  620.     gluSphere(qobj, 0.2, 16, 16);
  621.     glTranslatef(-1.0, 0.0, 0.0);
  622.   }
  623.   glScalef(-1.0, 1.0, 1.0);
  624. #endif
  625.   glEndList();
  626. }
  627.  
  628. void
  629. Shoulder(char solid)
  630. {
  631.   glNewList(SOLID_MECH_SHOULDER, GL_COMPILE);
  632. #ifdef LIGHT
  633.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  634. #endif
  635.   glColor3f(1.0, 1.0, 0.0);
  636.   Box(1.0, 0.5, 0.5, solid);
  637.   glTranslatef(0.9, 0.0, 0.0);
  638. #ifdef LIGHT
  639.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  640. #endif
  641.   glColor3f(0.5, 0.5, 0.5);
  642. #ifdef SPHERE
  643.   if (!solid)
  644.     gluQuadricDrawStyle(qobj, GLU_LINE);
  645.   gluSphere(qobj, 0.6, 16, 16);
  646. #endif
  647.   glTranslatef(-0.9, 0.0, 0.0);
  648.   glEndList();
  649. }
  650.  
  651. void
  652. UpperArm(char solid)
  653. {
  654.   int i;
  655.  
  656.   glNewList(SOLID_MECH_UPPER_ARM, GL_COMPILE);
  657. #ifdef LIGHT
  658.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  659. #endif
  660.   glColor3f(1.0, 1.0, 0.0);
  661.   Box(1.0, 2.0, 1.0, solid);
  662.   glTranslatef(0.0, -0.95, 0.0);
  663.   glRotatef(90.0, 1.0, 0.0, 0.0);
  664. #ifdef LIGHT
  665.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  666. #endif
  667.   glColor3f(0.5, 0.5, 0.5);
  668.   if (!solid)
  669.     gluQuadricDrawStyle(qobj, GLU_LINE);
  670.   gluCylinder(qobj, 0.4, 0.4, 1.5, 16, 10);
  671. #ifdef LIGHT
  672.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  673. #endif
  674.   glColor3f(1.0, 1.0, 0.0);
  675.   glRotatef(-90.0, 1.0, 0.0, 0.0);
  676.   glTranslatef(-0.4, -1.85, 0.0);
  677.   glRotatef(90.0, 0.0, 1.0, 0.0);
  678.   for (i = 0; i < 2; i++) {
  679.     if (!solid)
  680.       gluQuadricDrawStyle(qobj, GLU_LINE);
  681.     if (i)
  682.       gluCylinder(qobj, 0.5, 0.5, 0.8, 16, 10);
  683.     else
  684.       gluCylinder(qobj, 0.2, 0.2, 0.8, 16, 10);
  685.   }
  686.   for (i = 0; i < 2; i++) {
  687.     if (i)
  688.       glScalef(-1.0, 1.0, 1.0);
  689.     if (!solid)
  690.       gluQuadricDrawStyle(qobj, GLU_LINE);
  691.     if (i)
  692.       glTranslatef(0.0, 0.0, 0.8);
  693.     gluDisk(qobj, 0.2, 0.5, 16, 10);
  694.     if (i)
  695.       glTranslatef(0.0, 0.0, -0.8);
  696.   }
  697.   glScalef(-1.0, 1.0, 1.0);
  698.   glRotatef(-90.0, 0.0, 1.0, 0.0);
  699.   glTranslatef(0.4, 2.9, 0.0);
  700.   glEndList();
  701. }
  702.  
  703. void
  704. VulcanGun(char solid)
  705. {
  706.   int i;
  707.  
  708.   glNewList(SOLID_MECH_VULCAN, GL_COMPILE);
  709.  
  710. #ifdef LIGHT
  711.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  712. #endif
  713.   glColor3f(0.5, 0.5, 0.5);
  714.  
  715.   if (!solid) {
  716.     gluQuadricDrawStyle(qobj, GLU_LINE);
  717.   }
  718.   gluCylinder(qobj, 0.5, 0.5, 0.5, 16, 10);
  719.   glTranslatef(0.0, 0.0, 0.5);
  720.   gluDisk(qobj, 0.0, 0.5, 16, 10);
  721.  
  722.   for (i = 0; i < 5; i++) {
  723.     glRotatef(72.0, 0.0, 0.0, 1.0);
  724.     glTranslatef(0.0, 0.3, 0.0);
  725.     if (!solid) {
  726.       gluQuadricDrawStyle(qobj, GLU_LINE);
  727.     }
  728.     gluCylinder(qobj, 0.15, 0.15, 2.0, 16, 10);
  729.     gluCylinder(qobj, 0.06, 0.06, 2.0, 16, 10);
  730.     glTranslatef(0.0, 0.0, 2.0);
  731.     gluDisk(qobj, 0.1, 0.15, 16, 10);
  732.     gluCylinder(qobj, 0.1, 0.1, 0.1, 16, 5);
  733.     glTranslatef(0.0, 0.0, 0.1);
  734.     gluDisk(qobj, 0.06, 0.1, 16, 5);
  735.     glTranslatef(0.0, -0.3, -2.1);
  736.   }
  737.   glEndList();
  738. }
  739.  
  740. void
  741. ForeArm(char solid)
  742. {
  743.   char i;
  744.  
  745.   glNewList(SOLID_MECH_FOREARM, GL_COMPILE);
  746. #ifdef LIGHT
  747.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  748. #endif
  749.   glColor3f(1.0, 1.0, 0.0);
  750.   for (i = 0; i < 5; i++) {
  751.     glTranslatef(0.0, -0.1, -0.15);
  752.     Box(0.6, 0.8, 0.2, solid);
  753.     glTranslatef(0.0, 0.1, -0.15);
  754.     Box(0.4, 0.6, 0.1, solid);
  755.   }
  756.   glTranslatef(0.0, 0.0, 2.45);
  757.   Box(1.0, 1.0, 2.0, solid);
  758.   glTranslatef(0.0, 0.0, -1.0);
  759.   glEndList();
  760. }
  761.  
  762. void
  763. UpperLeg(char solid)
  764. {
  765.   int i;
  766.  
  767.   glNewList(SOLID_MECH_UPPER_LEG, GL_COMPILE);
  768. #ifdef LIGHT
  769.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  770. #endif
  771.   glColor3f(1.0, 1.0, 0.0);
  772.   if (!solid) {
  773.     gluQuadricDrawStyle(qobj, GLU_LINE);
  774.   }
  775.   glTranslatef(0.0, -1.0, 0.0);
  776.   Box(0.4, 1.0, 0.7, solid);
  777.   glTranslatef(0.0, -0.65, 0.0);
  778.   for (i = 0; i < 5; i++) {
  779.     Box(1.2, 0.3, 1.2, solid);
  780.     glTranslatef(0.0, -0.2, 0.0);
  781.     Box(1.0, 0.1, 1.0, solid);
  782.     glTranslatef(0.0, -0.2, 0.0);
  783.   }
  784.   glTranslatef(0.0, -0.15, -0.4);
  785.   Box(2.0, 0.5, 2.0, solid);
  786.   glTranslatef(0.0, -0.3, -0.2);
  787.   glRotatef(90.0, 1.0, 0.0, 0.0);
  788. #ifdef LIGHT
  789.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  790. #endif
  791.   glColor3f(0.5, 0.5, 0.5);
  792.   gluCylinder(qobj, 0.6, 0.6, 3.0, 16, 10);
  793. #ifdef LIGHT
  794.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  795. #endif
  796.   glColor3f(1.0, 1.0, 0.0);
  797.   glRotatef(-90.0, 1.0, 0.0, 0.0);
  798.   glTranslatef(0.0, -1.5, 1.0);
  799.   Box(1.5, 3.0, 0.5, solid);
  800.   glTranslatef(0.0, -1.75, -0.8);
  801.   Box(2.0, 0.5, 2.0, solid);
  802.   glTranslatef(0.0, -0.9, -0.85);
  803. #ifdef LIGHT
  804.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  805. #endif
  806.   glColor3f(0.5, 0.5, 0.5);
  807.   gluCylinder(qobj, 0.8, 0.8, 1.8, 16, 10);
  808.   for (i = 0; i < 2; i++) {
  809.     if (i)
  810.       glScalef(-1.0, 1.0, 1.0);
  811.     if (!solid)
  812.       gluQuadricDrawStyle(qobj, GLU_LINE);
  813.     if (i)
  814.       glTranslatef(0.0, 0.0, 1.8);
  815.     gluDisk(qobj, 0.0, 0.8, 16, 10);
  816.     if (i)
  817.       glTranslatef(0.0, 0.0, -1.8);
  818.   }
  819.   glScalef(-1.0, 1.0, 1.0);
  820.   glEndList();
  821. }
  822.  
  823. void
  824. Foot(char solid)
  825. {
  826.  
  827.   glNewList(SOLID_MECH_FOOT, GL_COMPILE);
  828. #ifdef LIGHT
  829.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  830. #endif
  831.   glColor3f(0.5, 0.5, 0.5);
  832.   glRotatef(90.0, 1.0, 0.0, 0.0);
  833.   Octagon(1.5, 0.6, solid);
  834.   glRotatef(-90.0, 1.0, 0.0, 0.0);
  835.   glEndList();
  836. }
  837.  
  838. void
  839. LowerLeg(char solid)
  840. {
  841.   float k, l;
  842.  
  843. #ifdef LIGHT
  844.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  845. #endif
  846.   glColor3f(1.0, 1.0, 0.0);
  847.   for (k = 0.0; k < 2.0; k++) {
  848.     for (l = 0.0; l < 2.0; l++) {
  849.       glPushMatrix();
  850.       glTranslatef(k, 0.0, l);
  851. #ifdef LIGHT
  852.       SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  853. #endif
  854.       glColor3f(1.0, 1.0, 0.0);
  855.       Box(1.0, 0.5, 1.0, solid);
  856.       glTranslatef(0.0, -0.45, 0.0);
  857. #ifdef LIGHT
  858.       SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  859. #endif
  860.       glColor3f(0.5, 0.5, 0.5);
  861. #ifdef SPHERE
  862.       if (!solid)
  863.         glutWireSphere(0.2, 16, 10);
  864.       else
  865.         glutSolidSphere(0.2, 16, 10);
  866. #endif
  867.       if (leg)
  868.         glRotatef((GLfloat) heel1, 1.0, 0.0, 0.0);
  869.       else
  870.         glRotatef((GLfloat) heel2, 1.0, 0.0, 0.0);
  871.       /* glTranslatef(0.0, -0.2, 0.0); */
  872.       glTranslatef(0.0, -1.7, 0.0);
  873. #ifdef LIGHT
  874.       SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  875. #endif
  876.       glColor3f(1.0, 1.0, 0.0);
  877.       Box(0.25, 3.0, 0.25, solid);
  878.       glTranslatef(0.0, -1.7, 0.0);
  879. #ifdef LIGHT
  880.       SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  881. #endif
  882.       glColor3f(0.5, 0.5, 0.5);
  883. #ifdef SPHERE
  884.       if (!solid)
  885.         glutWireSphere(0.2, 16, 10);
  886.       else
  887.         glutSolidSphere(0.2, 16, 10);
  888. #endif
  889.       if (leg)
  890.         glRotatef((GLfloat) - heel1, 1.0, 0.0, 0.0);
  891.       else
  892.         glRotatef((GLfloat) - heel2, 1.0, 0.0, 0.0);
  893.       glTranslatef(0.0, -0.45, 0.0);
  894. #ifdef LIGHT
  895.       SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  896. #endif
  897.       glColor3f(1.0, 1.0, 0.0);
  898.       Box(1.0, 0.5, 1.0, solid);
  899.       if (!k && !l) {
  900.         int j;
  901.  
  902.         glTranslatef(-0.4, -0.8, 0.5);
  903.         if (leg)
  904.           glRotatef((GLfloat) ankle1, 1.0, 0.0, 0.0);
  905.         else
  906.           glRotatef((GLfloat) ankle2, 1.0, 0.0, 0.0);
  907.         glRotatef(90.0, 0.0, 1.0, 0.0);
  908.         if (!solid)
  909.           gluQuadricDrawStyle(qobj, GLU_LINE);
  910.         gluCylinder(qobj, 0.8, 0.8, 1.8, 16, 10);
  911.         for (j = 0; j < 2; j++) {
  912.           if (!solid)
  913.             gluQuadricDrawStyle(qobj, GLU_LINE);
  914.           if (j) {
  915.             glScalef(-1.0, 1.0, 1.0);
  916.             glTranslatef(0.0, 0.0, 1.8);
  917.           }
  918.           gluDisk(qobj, 0.0, 0.8, 16, 10);
  919.           if (j)
  920.             glTranslatef(0.0, 0.0, -1.8);
  921.         }
  922.         glScalef(-1.0, 1.0, 1.0);
  923.         glRotatef(-90.0, 0.0, 1.0, 0.0);
  924.         glTranslatef(0.95, -0.8, 0.0);
  925.         glCallList(SOLID_MECH_FOOT);
  926.       }
  927.       glPopMatrix();
  928.     }
  929.   }
  930. }
  931.  
  932. void
  933. RocketPod(char solid)
  934. {
  935.  
  936.   int i, j, k = 0;
  937.  
  938.   glNewList(SOLID_MECH_ROCKET, GL_COMPILE);
  939. #ifdef LIGHT
  940.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  941. #endif
  942.   glColor3f(0.5, 0.5, 0.5);
  943.   glScalef(0.4, 0.4, 0.4);
  944.   glRotatef(45.0, 0.0, 0.0, 1.0);
  945.   glTranslatef(1.0, 0.0, 0.0);
  946.   Box(2.0, 0.5, 3.0, solid);
  947.   glTranslatef(1.0, 0.0, 0.0);
  948.   glRotatef(45.0, 0.0, 0.0, 1.0);
  949.   glTranslatef(0.5, 0.0, 0.0);
  950.   Box(1.2, 0.5, 3.0, solid);
  951.   glTranslatef(2.1, 0.0, 0.0);
  952.   glRotatef(-90.0, 0.0, 0.0, 1.0);
  953. #ifdef LIGHT
  954.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  955. #endif
  956.   glColor3f(1.0, 1.0, 0.0);
  957.   Box(2.0, 3.0, 4.0, solid);
  958.   glTranslatef(-0.5, -1.0, 1.3);
  959.   for (i = 0; i < 2; i++) {
  960.     for (j = 0; j < 3; j++) {
  961.       if (!solid) {
  962.         gluQuadricDrawStyle(qobj, GLU_LINE);
  963.       }
  964.       glTranslatef(i, j, 0.6);
  965. #ifdef LIGHT
  966.       SetMaterial(mat_specular3, mat_ambient3, mat_diffuse3, mat_shininess3);
  967. #endif
  968.       glColor3f(1.0, 1.0, 1.0);
  969.       gluCylinder(qobj, 0.4, 0.4, 0.3, 16, 10);
  970.       glTranslatef(0.0, 0.0, 0.3);
  971. #ifdef LIGHT
  972.       SetMaterial(mat_specular4, mat_ambient4, mat_diffuse4, mat_shininess4);
  973. #endif
  974.       glColor3f(0.0, 1.0, 0.0);
  975.       gluCylinder(qobj, 0.4, 0.0, 0.5, 16, 10);
  976.       k++;
  977.       glTranslatef(-i, -j, -0.9);
  978.     }
  979.   }
  980.   glEndList();
  981. }
  982.  
  983. void
  984. Enviro(char solid)
  985. {
  986.  
  987.   int i, j;
  988.  
  989.   glNewList(SOLID_ENVIRO, GL_COMPILE);
  990.   SetMaterial(mat_specular4, mat_ambient4, mat_diffuse4, mat_shininess4);
  991.   glColor3f(0.0, 1.0, 0.0);
  992.   Box(20.0, 0.5, 30.0, solid);
  993.   SetMaterial(mat_specular4, mat_ambient3, mat_diffuse2, mat_shininess);
  994.   glColor3f(0.6, 0.6, 0.6);
  995.   glTranslatef(0.0, 0.0, -10.0);
  996.   for (j = 0; j < 6; j++) {
  997.     for (i = 0; i < 2; i++) {
  998.       if (i)
  999.         glScalef(-1.0, 1.0, 1.0);
  1000.       glTranslatef(10.0, 4.0, 0.0);
  1001.       Box(4.0, 8.0, 2.0, solid);
  1002.       glTranslatef(0.0, -1.0, -3.0);
  1003.       Box(4.0, 6.0, 2.0, solid);
  1004.       glTranslatef(-10.0, -3.0, 3.0);
  1005.     }
  1006.     glScalef(-1.0, 1.0, 1.0);
  1007.     glTranslatef(0.0, 0.0, 5.0);
  1008.   }
  1009.   glEndList();
  1010. }
  1011.  
  1012. void
  1013. Toggle(void)
  1014. {
  1015.   if (solid_part)
  1016.     solid_part = 0;
  1017.   else
  1018.     solid_part = 1;
  1019. }
  1020.  
  1021. void
  1022. disable(void)
  1023. {
  1024.   glDisable(GL_LIGHTING);
  1025.   glDisable(GL_DEPTH_TEST);
  1026.   glDisable(GL_NORMALIZE);
  1027.   glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  1028. }
  1029.  
  1030. void
  1031. lighting(void)
  1032. {
  1033.  
  1034.   GLfloat position[] =
  1035.   {0.0, 0.0, 2.0, 1.0};
  1036.  
  1037. #ifdef MOVE_LIGHT
  1038.   glRotatef((GLfloat) lightturn1, 1.0, 0.0, 0.0);
  1039.   glRotatef((GLfloat) lightturn, 0.0, 1.0, 0.0);
  1040.   glRotatef(0.0, 1.0, 0.0, 0.0);
  1041. #endif
  1042.   glEnable(GL_LIGHTING);
  1043.   glEnable(GL_LIGHT0);
  1044.   glEnable(GL_NORMALIZE);
  1045.   glDepthFunc(GL_LESS);
  1046.   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  1047.  
  1048.   glLightfv(GL_LIGHT0, GL_POSITION, position);
  1049.   glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 80.0);
  1050.  
  1051.   glTranslatef(0.0, 0.0, 2.0);
  1052.   glDisable(GL_LIGHTING);
  1053.   Box(0.1, 0.1, 0.1, 0);
  1054.   glEnable(GL_LIGHTING);
  1055. }
  1056.  
  1057. void
  1058. DrawMech(void)
  1059. {
  1060.   int i, j;
  1061.  
  1062.   glScalef(0.5, 0.5, 0.5);
  1063.   glPushMatrix();
  1064.   glTranslatef(0.0, -0.75, 0.0);
  1065.   glRotatef((GLfloat) tilt, 1.0, 0.0, 0.0);
  1066.  
  1067.   glRotatef(90.0, 1.0, 0.0, 0.0);
  1068. #ifdef HIP
  1069.   glCallList(SOLID_MECH_HIP);
  1070. #endif
  1071.   glRotatef(-90.0, 1.0, 0.0, 0.0);
  1072.  
  1073.   glTranslatef(0.0, 0.75, 0.0);
  1074.   glPushMatrix();
  1075.   glRotatef((GLfloat) pivot, 0.0, 1.0, 0.0);
  1076.   glPushMatrix();
  1077. #ifdef TORSO
  1078.   glCallList(SOLID_MECH_TORSO);
  1079. #endif
  1080.   glPopMatrix();
  1081.   glPushMatrix();
  1082.   glTranslatef(0.5, 0.5, 0.0);
  1083. #ifdef ROCKET_POD
  1084.   glCallList(SOLID_MECH_ROCKET);
  1085. #endif
  1086.   glPopMatrix();
  1087.   for (i = 0; i < 2; i++) {
  1088.     glPushMatrix();
  1089.     if (i)
  1090.       glScalef(-1.0, 1.0, 1.0);
  1091.     glTranslatef(1.5, 0.0, 0.0);
  1092. #ifdef SHOULDER
  1093.     glCallList(SOLID_MECH_SHOULDER);
  1094. #endif
  1095.     glTranslatef(0.9, 0.0, 0.0);
  1096.     if (i) {
  1097.       glRotatef((GLfloat) lat1, 0.0, 0.0, 1.0);
  1098.       glRotatef((GLfloat) shoulder1, 1.0, 0.0, 0.0);
  1099.       glRotatef((GLfloat) shoulder3, 0.0, 1.0, 0.0);
  1100.     } else {
  1101.       glRotatef((GLfloat) lat2, 0.0, 0.0, 1.0);
  1102.       glRotatef((GLfloat) shoulder2, 1.0, 0.0, 0.0);
  1103.       glRotatef((GLfloat) shoulder4, 0.0, 1.0, 0.0);
  1104.     }
  1105.     glTranslatef(0.0, -1.4, 0.0);
  1106. #ifdef UPPER_ARM
  1107.     glCallList(SOLID_MECH_UPPER_ARM);
  1108. #endif
  1109.     glTranslatef(0.0, -2.9, 0.0);
  1110.     if (i)
  1111.       glRotatef((GLfloat) elbow1, 1.0, 0.0, 0.0);
  1112.     else
  1113.       glRotatef((GLfloat) elbow2, 1.0, 0.0, 0.0);
  1114.     glTranslatef(0.0, -0.9, -0.2);
  1115. #ifdef LOWER_ARM
  1116.     glCallList(SOLID_MECH_FOREARM);
  1117.     glPushMatrix();
  1118.     glTranslatef(0.0, 0.0, 2.0);
  1119.     glRotatef((GLfloat) fire, 0.0, 0.0, 1.0);
  1120.     glCallList(SOLID_MECH_VULCAN);
  1121.     glPopMatrix();
  1122. #endif
  1123.     glPopMatrix();
  1124.   }
  1125.   glPopMatrix();
  1126.  
  1127.   glPopMatrix();
  1128.  
  1129.   for (j = 0; j < 2; j++) {
  1130.     glPushMatrix();
  1131.     if (j) {
  1132.       glScalef(-0.5, 0.5, 0.5);
  1133.       leg = 1;
  1134.     } else {
  1135.       glScalef(0.5, 0.5, 0.5);
  1136.       leg = 0;
  1137.     }
  1138.     glTranslatef(2.0, -1.5, 0.0);
  1139.     if (j) {
  1140.       glRotatef((GLfloat) hip11, 1.0, 0.0, 0.0);
  1141.       glRotatef((GLfloat) hip12, 0.0, 0.0, 1.0);
  1142.     } else {
  1143.       glRotatef((GLfloat) hip21, 1.0, 0.0, 0.0);
  1144.       glRotatef((GLfloat) hip22, 0.0, 0.0, 1.0);
  1145.     }
  1146.     glTranslatef(0.0, 0.3, 0.0);
  1147. #ifdef UPPER_LEG
  1148.     glPushMatrix();
  1149.     glCallList(SOLID_MECH_UPPER_LEG);
  1150.     glPopMatrix();
  1151. #endif
  1152.     glTranslatef(0.0, -8.3, -0.4);
  1153.     if (j)
  1154.       glRotatef((GLfloat) - hip12, 0.0, 0.0, 1.0);
  1155.     else
  1156.       glRotatef((GLfloat) - hip22, 0.0, 0.0, 1.0);
  1157.     glTranslatef(-0.5, -0.85, -0.5);
  1158. #ifdef LOWER_LEG
  1159.     LowerLeg(1);
  1160. #endif
  1161.     glPopMatrix();
  1162.   }
  1163. }
  1164.  
  1165. void
  1166. display(void)
  1167. {
  1168.   glClearColor(0.0, 0.0, 0.0, 0.0);
  1169.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  1170.   glEnable(GL_DEPTH_TEST);
  1171.  
  1172.   glPushMatrix();
  1173.   glRotatef((GLfloat) turn, 0.0, 1.0, 0.0);
  1174.   glRotatef((GLfloat) turn1, 1.0, 0.0, 0.0);
  1175. #ifdef LIGHT
  1176.   if (solid_part) {
  1177.     glPushMatrix();
  1178.     lighting();
  1179.     glPopMatrix();
  1180.   } else
  1181.     disable();
  1182. #endif
  1183. #ifdef DRAW_MECH
  1184.   glPushMatrix();
  1185.   glTranslatef(0.0, elevation, 0.0);
  1186.   DrawMech();
  1187.   glPopMatrix();
  1188. #endif
  1189. #ifdef DRAW_ENVIRO
  1190.   glPushMatrix();
  1191.   if (distance >= 20.136)
  1192.     distance = 0.0;
  1193.   glTranslatef(0.0, -5.0, -distance);
  1194.   glCallList(SOLID_ENVIRO);
  1195.   glTranslatef(0.0, 0.0, 10.0);
  1196.   glCallList(SOLID_ENVIRO);
  1197.   glPopMatrix();
  1198. #endif
  1199.   glPopMatrix();
  1200.   glFlush();
  1201.   glutSwapBuffers();
  1202. }
  1203.  
  1204. void
  1205. myinit(void)
  1206. {
  1207.   char i = 1;
  1208.  
  1209.   qobj = gluNewQuadric();
  1210. #ifdef LIGHT
  1211.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  1212. #endif
  1213.   glEnable(GL_DEPTH_TEST);
  1214.   MechTorso(i);
  1215.   MechHip(i);
  1216.   Shoulder(i);
  1217.   RocketPod(i);
  1218.   UpperArm(i);
  1219.   ForeArm(i);
  1220.   UpperLeg(i);
  1221.   Foot(i);
  1222.   VulcanGun(i);
  1223.   Enviro(i);
  1224. }
  1225.  
  1226. void
  1227. myReshape(int w, int h)
  1228. {
  1229.   glViewport(0, 0, w, h);
  1230.   glMatrixMode(GL_PROJECTION);
  1231.   glLoadIdentity();
  1232.   gluPerspective(65.0, (GLfloat) w / (GLfloat) h, 1.0, 20.0);
  1233.   glMatrixMode(GL_MODELVIEW);
  1234.   glLoadIdentity();
  1235.   glTranslatef(0.0, 1.2, -5.5);  /* viewing transform  */
  1236. }
  1237.  
  1238. #ifdef ANIMATION
  1239. void
  1240. animation_walk(void)
  1241. {
  1242.   float angle;
  1243.   static int step;
  1244.  
  1245.   if (step == 0 || step == 2) {
  1246.     /* for(frame=3.0; frame<=21.0; frame=frame+3.0){ */
  1247.     if (frame >= 0.0 && frame <= 21.0) {
  1248.       if (frame == 0.0)
  1249.         frame = 3.0;
  1250.       angle = (180 / M_PI) * (acos(((cos((M_PI / 180) * frame) * 2.043) + 1.1625) / 3.2059));
  1251.       if (frame > 0) {
  1252.         elevation = -(3.2055 - (cos((M_PI / 180) * angle) * 3.2055));
  1253.       } else
  1254.         elevation = 0.0;
  1255.       if (step == 0) {
  1256.         hip11 = -(frame * 1.7);
  1257.         if (1.7 * frame > 15)
  1258.           heel1 = frame * 1.7;
  1259.         heel2 = 0;
  1260.         ankle1 = frame * 1.7;
  1261.         if (frame > 0)
  1262.           hip21 = angle;
  1263.         else
  1264.           hip21 = 0;
  1265.         ankle2 = -hip21;
  1266.         shoulder1 = frame * 1.5;
  1267.         shoulder2 = -frame * 1.5;
  1268.         elbow1 = frame;
  1269.         elbow2 = -frame;
  1270.       } else {
  1271.         hip21 = -(frame * 1.7);
  1272.         if (1.7 * frame > 15)
  1273.           heel2 = frame * 1.7;
  1274.         heel1 = 0;
  1275.         ankle2 = frame * 1.7;
  1276.         if (frame > 0)
  1277.           hip11 = angle;
  1278.         else
  1279.           hip11 = 0;
  1280.         ankle1 = -hip11;
  1281.         shoulder1 = -frame * 1.5;
  1282.         shoulder2 = frame * 1.5;
  1283.         elbow1 = -frame;
  1284.         elbow2 = frame;
  1285.       }
  1286.       if (frame == 21)
  1287.         step++;
  1288.       if (frame < 21)
  1289.         frame = frame + 3.0;
  1290.     }
  1291.   }
  1292.   if (step == 1 || step == 3) {
  1293.     /* for(x=21.0; x>=0.0; x=x-3.0){ */
  1294.     if (frame <= 21.0 && frame >= 0.0) {
  1295.       angle = (180 / M_PI) * (acos(((cos((M_PI / 180) * frame) * 2.043) + 1.1625) / 3.2029));
  1296.       if (frame > 0)
  1297.         elevation = -(3.2055 - (cos((M_PI / 180) * angle) * 3.2055));
  1298.       else
  1299.         elevation = 0.0;
  1300.       if (step == 1) {
  1301.         elbow2 = hip11 = -frame;
  1302.         elbow1 = heel1 = frame;
  1303.         heel2 = 15;
  1304.         ankle1 = frame;
  1305.         if (frame > 0)
  1306.           hip21 = angle;
  1307.         else
  1308.           hip21 = 0;
  1309.         ankle2 = -hip21;
  1310.         shoulder1 = 1.5 * frame;
  1311.         shoulder2 = -frame * 1.5;
  1312.       } else {
  1313.         elbow1 = hip21 = -frame;
  1314.         elbow2 = heel2 = frame;
  1315.         heel1 = 15;
  1316.         ankle2 = frame;
  1317.         if (frame > 0)
  1318.           hip11 = angle;
  1319.         else
  1320.           hip11 = 0;
  1321.         ankle1 = -hip11;
  1322.         shoulder1 = -frame * 1.5;
  1323.         shoulder2 = frame * 1.5;
  1324.       }
  1325.       if (frame == 0.0)
  1326.         step++;
  1327.       if (frame > 0)
  1328.         frame = frame - 3.0;
  1329.     }
  1330.   }
  1331.   if (step == 4)
  1332.     step = 0;
  1333.   distance += 0.1678;
  1334.   glutPostRedisplay();
  1335. }
  1336.  
  1337. void
  1338. animation(void)
  1339. {
  1340.   animation_walk();
  1341. }
  1342.  
  1343. #endif
  1344.  
  1345. #ifdef GLUT
  1346. #ifdef GLUT_KEY
  1347. /* ARGSUSED1 */
  1348. void
  1349. keyboard(unsigned char key, int x, int y)
  1350. {
  1351.  
  1352.   int i = 0;
  1353.  
  1354.   switch (key) {
  1355.     /* start arm control functions */
  1356.   case 'q':{
  1357.       shoulder2Subtract();
  1358.       i++;
  1359.     }
  1360.     break;
  1361.   case 'a':{
  1362.       shoulder2Add();
  1363.       i++;
  1364.     }
  1365.     break;
  1366.   case 'w':{
  1367.       shoulder1Subtract();
  1368.       i++;
  1369.     }
  1370.     break;
  1371.   case 's':{
  1372.       shoulder1Add();
  1373.       i++;
  1374.     }
  1375.     break;
  1376.   case '2':{
  1377.       shoulder3Add();
  1378.       i++;
  1379.     }
  1380.     break;
  1381.   case '1':{
  1382.       shoulder4Add();
  1383.       i++;
  1384.     }
  1385.     break;
  1386.   case '4':{
  1387.       shoulder3Subtract();
  1388.       i++;
  1389.     }
  1390.     break;
  1391.   case '3':{
  1392.       shoulder4Subtract();
  1393.       i++;
  1394.     }
  1395.     break;
  1396.  
  1397.   case 'z':{
  1398.       lat2Raise();
  1399.       i++;
  1400.     }
  1401.     break;
  1402.   case 'Z':{
  1403.       lat2Lower();
  1404.       i++;
  1405.     }
  1406.     break;
  1407.   case 'x':{
  1408.       lat1Raise();
  1409.       i++;
  1410.     }
  1411.     break;
  1412.   case 'X':{
  1413.       lat1Lower();
  1414.       i++;
  1415.     }
  1416.     break;
  1417.  
  1418.   case 'A':{
  1419.       elbow2Add();
  1420.       i++;
  1421.     }
  1422.     break;
  1423.   case 'Q':{
  1424.       elbow2Subtract();
  1425.       i++;
  1426.     }
  1427.     break;
  1428.   case 'S':{
  1429.       elbow1Add();
  1430.       i++;
  1431.     }
  1432.     break;
  1433.   case 'W':{
  1434.       elbow1Subtract();
  1435.       i++;
  1436.     }
  1437.     break;
  1438.     /* end of arm control functions */
  1439.  
  1440.     /* start of torso control functions */
  1441.   case 'd':{
  1442.       RotateAdd();
  1443.       i++;
  1444.     }
  1445.     break;
  1446.   case 'g':{
  1447.       RotateSubtract();
  1448.       i++;
  1449.     }
  1450.     break;
  1451.   case 'r':{
  1452.       MechTiltAdd();
  1453.       i++;
  1454.     }
  1455.     break;
  1456.   case 'f':{
  1457.       MechTiltSubtract();
  1458.       i++;
  1459.     }
  1460.     break;
  1461.     /* end of torso control functions */
  1462.  
  1463.     /* start of leg control functions */
  1464.   case 'h':{
  1465.       RaiseLeg2Forward();
  1466.       i++;
  1467.     }
  1468.     break;
  1469.   case 'y':{
  1470.       LowerLeg2Backwards();
  1471.       i++;
  1472.     }
  1473.     break;
  1474.   case 'Y':{
  1475.       RaiseLeg2Outwards();
  1476.       i++;
  1477.     }
  1478.     break;
  1479.   case 'H':{
  1480.       LowerLeg2Inwards();
  1481.       i++;
  1482.     }
  1483.     break;
  1484.  
  1485.   case 'j':{
  1486.       RaiseLeg1Forward();
  1487.       i++;
  1488.     }
  1489.     break;
  1490.   case 'u':{
  1491.       LowerLeg1Backwards();
  1492.       i++;
  1493.     }
  1494.     break;
  1495.   case 'U':{
  1496.       RaiseLeg1Outwards();
  1497.       i++;
  1498.     }
  1499.     break;
  1500.   case 'J':{
  1501.       LowerLeg1Inwards();
  1502.       i++;
  1503.     }
  1504.     break;
  1505.  
  1506.   case 'N':{
  1507.       Heel2Add();
  1508.       i++;
  1509.     }
  1510.     break;
  1511.   case 'n':{
  1512.       Heel2Subtract();
  1513.       i++;
  1514.     }
  1515.     break;
  1516.   case 'M':{
  1517.       Heel1Add();
  1518.       i++;
  1519.     }
  1520.     break;
  1521.   case 'm':{
  1522.       Heel1Subtract();
  1523.       i++;
  1524.     }
  1525.     break;
  1526.  
  1527.   case 'k':{
  1528.       Ankle2Add();
  1529.       i++;
  1530.     }
  1531.     break;
  1532.   case 'K':{
  1533.       Ankle2Subtract();
  1534.       i++;
  1535.     }
  1536.     break;
  1537.   case 'l':{
  1538.       Ankle1Add();
  1539.       i++;
  1540.     }
  1541.     break;
  1542.   case 'L':{
  1543.       Ankle1Subtract();
  1544.       i++;
  1545.     }
  1546.     break;
  1547.     /* end of leg control functions */
  1548.  
  1549.     /* start of light source position functions */
  1550.   case 'p':{
  1551.       LightTurnRight();
  1552.       i++;
  1553.     }
  1554.     break;
  1555.   case 'i':{
  1556.       LightTurnLeft();
  1557.       i++;
  1558.     }
  1559.     break;
  1560.   case 'o':{
  1561.       LightForwards();
  1562.       i++;
  1563.     }
  1564.     break;
  1565.   case '9':{
  1566.       LightBackwards();
  1567.       i++;
  1568.     }
  1569.     break;
  1570.     /* end of light source position functions */
  1571.   }
  1572.   if (i)
  1573.     glutPostRedisplay();
  1574. }
  1575.  
  1576. #endif
  1577.  
  1578. #ifdef GLUT_SPEC
  1579. /* ARGSUSED1 */
  1580. void
  1581. special(int key, int x, int y)
  1582. {
  1583.  
  1584.   int i = 0;
  1585.  
  1586.   switch (key) {
  1587.     /* start of view position functions */
  1588.   case GLUT_KEY_RIGHT:{
  1589.       TurnRight();
  1590.       i++;
  1591.     }
  1592.     break;
  1593.   case GLUT_KEY_LEFT:{
  1594.       TurnLeft();
  1595.       i++;
  1596.     }
  1597.     break;
  1598.   case GLUT_KEY_DOWN:{
  1599.       TurnForwards();
  1600.       i++;
  1601.     }
  1602.     break;
  1603.   case GLUT_KEY_UP:{
  1604.       TurnBackwards();
  1605.       i++;
  1606.     }
  1607.     break;
  1608.     /* end of view postions functions */
  1609.     /* start of miseclleneous functions */
  1610.   case GLUT_KEY_PAGE_UP:{
  1611.       FireCannon();
  1612.       i++;
  1613.     }
  1614.     break;
  1615.     /* end of miscelleneous functions */
  1616.   }
  1617.   if (i)
  1618.     glutPostRedisplay();
  1619. }
  1620.  
  1621. #endif
  1622. #endif
  1623. void
  1624. menu_select(int mode)
  1625. {
  1626.   switch (mode) {
  1627. #ifdef ANIMATION
  1628.   case 1:
  1629.     glutIdleFunc(animation);
  1630.     break;
  1631. #endif
  1632.   case 2:
  1633.     glutIdleFunc(NULL);
  1634.     break;
  1635.   case 3:
  1636.     Toggle();
  1637.     glutPostRedisplay();
  1638.     break;
  1639.   case 4:
  1640.     exit(EXIT_SUCCESS);
  1641.   }
  1642. }
  1643.  
  1644. /* ARGSUSED */
  1645. void
  1646. null_select(int mode)
  1647. {
  1648. }
  1649.  
  1650. void
  1651. glutMenu(void)
  1652. {
  1653.  
  1654.   int glut_menu[13];
  1655.  
  1656.   glut_menu[5] = glutCreateMenu(null_select);
  1657.   glutAddMenuEntry("forward       : q,w", 0);
  1658.   glutAddMenuEntry("backwards     : a,s", 0);
  1659.   glutAddMenuEntry("outwards      : z,x", 0);
  1660.   glutAddMenuEntry("inwards       : Z,X", 0);
  1661.  
  1662.   glut_menu[6] = glutCreateMenu(null_select);
  1663.   glutAddMenuEntry("upwards       : Q,W", 0);
  1664.   glutAddMenuEntry("downwards     : A,S", 0);
  1665.   glutAddMenuEntry("outwards      : 1,2", 0);
  1666.   glutAddMenuEntry("inwards       : 3,4", 0);
  1667.  
  1668.   glut_menu[1] = glutCreateMenu(null_select);
  1669.   glutAddMenuEntry(" : Page_up", 0);
  1670.  
  1671.   glut_menu[8] = glutCreateMenu(null_select);
  1672.   glutAddMenuEntry("forward       : y,u", 0);
  1673.   glutAddMenuEntry("backwards     : h.j", 0);
  1674.   glutAddMenuEntry("outwards      : Y,U", 0);
  1675.   glutAddMenuEntry("inwards       : H,J", 0);
  1676.  
  1677.   glut_menu[9] = glutCreateMenu(null_select);
  1678.   glutAddMenuEntry("forward       : n,m", 0);
  1679.   glutAddMenuEntry("backwards     : N,M", 0);
  1680.  
  1681.   glut_menu[9] = glutCreateMenu(null_select);
  1682.   glutAddMenuEntry("forward       : n,m", 0);
  1683.   glutAddMenuEntry("backwards     : N,M", 0);
  1684.  
  1685.   glut_menu[10] = glutCreateMenu(null_select);
  1686.   glutAddMenuEntry("toes up       : K,L", 0);
  1687.   glutAddMenuEntry("toes down     : k,l", 0);
  1688.  
  1689.   glut_menu[11] = glutCreateMenu(null_select);
  1690.   glutAddMenuEntry("right         : right arrow", 0);
  1691.   glutAddMenuEntry("left          : left arrow", 0);
  1692.   glutAddMenuEntry("down          : up arrow", 0);
  1693.   glutAddMenuEntry("up            : down arrow", 0);
  1694.  
  1695.   glut_menu[12] = glutCreateMenu(null_select);
  1696.   glutAddMenuEntry("right         : p", 0);
  1697.   glutAddMenuEntry("left          : i", 0);
  1698.   glutAddMenuEntry("up            : 9", 0);
  1699.   glutAddMenuEntry("down          : o", 0);
  1700.  
  1701.   glut_menu[4] = glutCreateMenu(NULL);
  1702.   glutAddSubMenu("at the shoulders? ", glut_menu[5]);
  1703.   glutAddSubMenu("at the elbows?", glut_menu[6]);
  1704.  
  1705.   glut_menu[7] = glutCreateMenu(NULL);
  1706.   glutAddSubMenu("at the hip? ", glut_menu[8]);
  1707.   glutAddSubMenu("at the knees?", glut_menu[9]);
  1708.   glutAddSubMenu("at the ankles? ", glut_menu[10]);
  1709.  
  1710.   glut_menu[2] = glutCreateMenu(null_select);
  1711.   glutAddMenuEntry("turn left    : d", 0);
  1712.   glutAddMenuEntry("turn right    : g", 0);
  1713.  
  1714.   glut_menu[3] = glutCreateMenu(null_select);
  1715.   glutAddMenuEntry("tilt backwards : f", 0);
  1716.   glutAddMenuEntry("tilt forwards  : r", 0);
  1717.  
  1718.   glut_menu[0] = glutCreateMenu(NULL);
  1719.   glutAddSubMenu("move the arms.. ", glut_menu[4]);
  1720.   glutAddSubMenu("fire the vulcan guns?", glut_menu[1]);
  1721.   glutAddSubMenu("move the legs.. ", glut_menu[7]);
  1722.   glutAddSubMenu("move the torso?", glut_menu[2]);
  1723.   glutAddSubMenu("move the hip?", glut_menu[3]);
  1724.   glutAddSubMenu("rotate the scene..", glut_menu[11]);
  1725. #ifdef MOVE_LIGHT
  1726.   glutAddSubMenu("rotate the light source..", glut_menu[12]);
  1727. #endif
  1728.  
  1729.   glutCreateMenu(menu_select);
  1730. #ifdef ANIMATION
  1731.   glutAddMenuEntry("Start Walk", 1);
  1732.   glutAddMenuEntry("Stop Walk", 2);
  1733. #endif
  1734.   glutAddMenuEntry("Toggle Wireframe", 3);
  1735.   glutAddSubMenu("How do I ..", glut_menu[0]);
  1736.   glutAddMenuEntry("Quit", 4);
  1737.   glutAttachMenu(GLUT_LEFT_BUTTON);
  1738.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  1739. }
  1740.  
  1741. int
  1742. main(int argc, char **argv)
  1743. {
  1744. #ifdef GLUT
  1745.   /* start of glut windowing and control functions */
  1746.   glutInit(&argc, argv);
  1747.   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
  1748.   glutInitWindowSize(800, 600);
  1749.   glutCreateWindow("glutmech: Vulcan Gunner");
  1750.   myinit();
  1751.   glutDisplayFunc(display);
  1752.   glutReshapeFunc(myReshape);
  1753. #ifdef GLUT_KEY
  1754.   glutKeyboardFunc(keyboard);
  1755. #endif
  1756. #ifdef GLUT_SPEC
  1757.   glutSpecialFunc(special);
  1758. #endif
  1759.   glutMenu();
  1760.   glutMainLoop();
  1761.   /* end of glut windowing and control functions */
  1762. #endif
  1763.   return 0;             /* ANSI C requires main to return int. */
  1764. }
  1765.